From 0a09b8dca70b0187a4ea2c22a08804162ca5b1a0 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 2 Jun 2019 22:21:05 +0000 Subject: [PATCH] gl: Improve cache dropping code There was a TODO here to avoid iterating the glyphs multiple times, so avoid that. And actually log the number of glyphs that was dropped. --- gsk/gl/gskglglyphcache.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/gsk/gl/gskglglyphcache.c b/gsk/gl/gskglglyphcache.c index ed0aeb479c..6e81b1b793 100644 --- a/gsk/gl/gskglglyphcache.c +++ b/gsk/gl/gskglglyphcache.c @@ -381,7 +381,7 @@ gsk_gl_glyph_cache_begin_frame (GskGLGlyphCache *self) GHashTableIter iter; GlyphCacheKey *key; GskGLCachedGlyph *value; - guint dropped = 0; + GHashTable *removed = g_hash_table_new (g_direct_hash, g_direct_equal); self->timestamp++; @@ -421,18 +421,29 @@ gsk_gl_glyph_cache_begin_frame (GskGLGlyphCache *self) atlas->image->texture_id = 0; } - /* Remove all glyphs that point to this atlas */ - g_hash_table_iter_init (&iter, self->hash_table); - while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *)&value)) - { - if (value->atlas == atlas) - g_hash_table_iter_remove (&iter); - } - /* TODO: The above loop inside this other loop could be slow... */ + g_hash_table_add (removed, atlas); g_ptr_array_remove_index (self->atlases, i); + } + } + + if (g_hash_table_size (removed) > 0) + { + guint dropped = 0; + + /* Remove all glyphs whose atlas was removed */ + g_hash_table_iter_init (&iter, self->hash_table); + while (g_hash_table_iter_next (&iter, (gpointer *)&key, (gpointer *)&value)) + { + if (g_hash_table_contains (removed, value->atlas)) + { + g_hash_table_iter_remove (&iter); + dropped++; + } } + + GSK_RENDERER_NOTE(self->renderer, GLYPH_CACHE, if (dropped > 0) g_message ("Dropped %d glyphs", dropped)); } - GSK_RENDERER_NOTE(self->renderer, GLYPH_CACHE, g_message ("Dropped %d glyphs", dropped)); + g_hash_table_unref (removed); } -- 2.30.2